﻿#ifndef CAMERAINIT_H
#define CAMERAINIT_H

#include <QObject>
#include <QTimer>
#include <algorithm>

#include "Buffer.h"
#include "CameraDataReadThread.h"
#include "CyUSBdeviceManger.h"

/*
 * 处理好的图片会更新在DataToImageThread::m_image变量中，当DataToImageThread::m_IsRead为true时表示当前图片处理完毕，可以进行获取。
 * 这里主要负责初始化以及运行各线程(上层只需要调用CameraInit对象即可完成操作) *上层只需要关注当前类以及m_image、m_IsRead两个静态变量即可*
 */

class CameraInit : public QObject
{
    Q_OBJECT
public:
    /**
     @interpret     CameraInit类的构造函数
     @param         height: 图片像素的高; width: 图片像素的宽; pixel: 图片像素的大小
     @return        无
     */
    explicit CameraInit(size_t height = ImageDefaultHeight, size_t width = ImageDefaultWidth, size_t pixel = ImageDefaultPixel, QObject *parent = nullptr);

    /**
     @interpret     根据传入的DeviceName找到对应索引，并打开该设备
     @param         DeviceName: 将要打开的设备名称
     @return        true-成功;false-失败;
     */
    bool OpenDevice(QString DeviceName);

    /**
     @interpret     关闭当前打开设备
     @param         无
     @return        true-成功;false-失败;
     */
    bool CloseDevice();

    /**
    @interpret     第一次程序运行检测当前电脑是否有设备连入
    @param         无
    @return        true-成功;false-失败;
    */
    bool FirstSelectDevice();
private slots:
    /**
     @interpret     处理底层设备刷新时的处理
     @param         USBVector: 刷新处理后的容器
     @return        无
     */
    void DeviceRefresh(DeviceStatus kind, QVector<USBDevice>* USBVector);
private:
    DataToImageThread*    m_ReadThread;         // 拼接线程(在ImageBuffer中被定义，所以这里无需定义，如果后续需要管理，则从ImageBuffer中获取)
    CameraDataReadThread* m_Thread;             // 读取数据线程
    Buffer*               m_Buffer;             // 缓冲区句柄
    ImageClass            m_ImageInfo;          // 当前图片的信息
    CyUSBDeviceManger*    m_DeviceManger;       // 用于管理设备的连接或者拔出
    QString               m_CurrentDeviceName;  // 当前打开设备的名称
signals:
    // 该信号主要给前端UI发送信号，使其刷新QConBox控件
    void senderRefreshDevice(QVector<USBDevice>* USBVector);
};

#endif // CAMERAINIT_H
